;
;  PROGRAM:  ECHO
;  AUTHOR:  RICHARD CONN
;  VERSION:  1.3
;  DATE:  17 AUG 83
;  PREVIOUS VERSIONS:  1.2 (21 JUN 83), 1.1 (6 JAN 83), 1.0 (10 DEC 82)
;
VERS	EQU	13

;
;	This program is Copyright (c) 1982, 1983 by Richard Conn
;	All Rights Reserved
;
;	ZCPR2 and its utilities, including this one, are released
; to the public domain.  Anyone who wishes to USE them may do so with
; no strings attached.  The author assumes no responsibility or
; liability for the use of ZCPR2 and its utilities.
;
;	The author, Richard Conn, has sole rights to this program.
; ZCPR2 and its utilities may not be sold without the express,
; written permission of the author.
;


;
;	ECHO is used to echo the command line to the screen.  It is invoked
; in the following ways:
;		ECHO			<-- print Help Message
;		ECHO //			<-- print Help Message
;		ECHO text		<-- print text
;		ECHO /po text		<-- print text on printer
;
;	This seems like a trivial program, but it buys the user one key thing:
; for ZCPR2 use, a message may be stored in the multiple command line buffer
; by using ECHO, so that programs like STARTUP can print a welcome message
; after they have run.  For STARTUP in particular, a sample command line
; would be:
;
;		ioloader;ld ld;tinit;echo WELCOME TO ZCPR II
;
;	This line runs IOLOADER, which loads the redirectable I/O devices,
; followed by LD LD, which loads a named directory into memory, and TINIT,
; which initializes a TVI 950 terminal (function keys, user line, etc).
; When all is done, TINIT will have cleared the screen and ECHO will have
; printed its message.
;
;	A second noted use for ECHO is in performing miscellaneous printer
; functions.  The /P option allows the user to send any text to the printer,
; and this text can include control characters.  This can be used to set
; printer controls for those printers which respond to commands from the
; user.  If the letter following the P is an N, then NO new line is printed
; following the text (otherwise, the text is followed by a CRLF).
;
;	Finally, a third noted use for ECHO is to set attributes of the
; user's terminal if he has a programmable terminal.  By passing control
; characters, ECHO allows any control sequence to be sent to a terminal.
;

;
;  Externals
;
	ext	crlf	; new line on console
	ext	lcrlf	; new line on printer
	ext	print	; print string pted to by return address
	ext	cout	; output to console
	ext	lout	; output to printer

;
;  CP/M Constants
;
tbuff	equ	80h	; console line buffer
cr	equ	0dh
lf	equ	0ah

;
;  Branch to Start of Program
;
	jmp	start

;
;******************************************************************
;
;  SINSFORM -- ZCPR2 Utility Standard General Purpose Initialization Format
;
;	This data block precisely defines the data format for
; initial features of a ZCPR2 system which are required for proper
; initialization of the ZCPR2-Specific Routines in SYSLIB.
;

;
;  EXTERNAL PATH DATA
;
EPAVAIL:
	DB	0FFH	; IS EXTERNAL PATH AVAILABLE? (0=NO, 0FFH=YES)
EPADR:
	DW	40H	; ADDRESS OF EXTERNAL PATH IF AVAILABLE

;
;  INTERNAL PATH DATA
;
INTPATH:
	DB	0,0	; DISK, USER FOR FIRST PATH ELEMENT
			; DISK = 1 FOR A, '$' FOR CURRENT
			; USER = NUMBER, '$' FOR CURRENT
	DB	0,0
	DB	0,0
	DB	0,0
	DB	0,0
	DB	0,0
	DB	0,0
	DB	0,0	; DISK, USER FOR 8TH PATH ELEMENT
	DB	0	; END OF PATH

;
;  MULTIPLE COMMAND LINE BUFFER DATA
;
MCAVAIL:
	DB	0FFH	; IS MULTIPLE COMMAND LINE BUFFER AVAILABLE?
MCADR:
	DW	0FF00H	; ADDRESS OF MULTIPLE COMMAND LINE BUFFER IF AVAILABLE

;
;  DISK/USER LIMITS
;
MDISK:
	DB	4	; MAXIMUM NUMBER OF DISKS
MUSER:
	DB	31	; MAXIMUM USER NUMBER

;
;  FLAGS TO PERMIT LOG IN FOR DIFFERENT USER AREA OR DISK
;
DOK:
	DB	0FFH	; ALLOW DISK CHANGE? (0=NO, 0FFH=YES)
UOK:
	DB	0FFH	; ALLOW USER CHANGE? (0=NO, 0FFH=YES)

;
;  PRIVILEGED USER DATA
;
PUSER:
	DB	10	; BEGINNING OF PRIVILEGED USER AREAS
PPASS:
	DB	'chdir',0	; PASSWORD FOR MOVING INTO PRIV USER AREAS
	DS	41-($-PPASS)	; 40 CHARS MAX IN BUFFER + 1 for ending NULL

;
;  CURRENT USER/DISK INDICATOR
;
CINDIC:
	DB	'$'	; USUAL VALUE (FOR PATH EXPRESSIONS)

;
;  DMA ADDRESS FOR DISK TRANSFERS
;
DMADR:
	DW	80H	; TBUFF AREA

;
;  NAMED DIRECTORY INFORMATION
;
NDRADR:
	DW	00000H	; ADDRESS OF MEMORY-RESIDENT NAMED DIRECTORY
NDNAMES:
	DB	64	; MAX NUMBER OF DIRECTORY NAMES
DNFILE:
	DB	'NAMES   '	; NAME OF DISK NAME FILE
	DB	'DIR'		; TYPE OF DISK NAME FILE

;
;  REQUIREMENTS FLAGS
;
EPREQD:
	DB	000H	; EXTERNAL PATH?
MCREQD:
	DB	000H	; MULTIPLE COMMAND LINE?
MXREQD:
	DB	000H	; MAX USER/DISK?
UDREQD:
	DB	000H	; ALLOW USER/DISK CHANGE?
PUREQD:
	DB	000H	; PRIVILEGED USER?
CDREQD:
	DB	000H	; CURRENT INDIC AND DMA?
NDREQD:
	DB	000H	; NAMED DIRECTORIES?
Z2CLASS:
	DB	0	; CLASS 0
	DB	'ZCPR2'
	DS	10	; RESERVED

;
;  END OF SINSFORM -- STANDARD DEFAULT PARAMETER DATA
;
;******************************************************************
;

;
;  Start of Program
;
start:
	xra	a
	sta	pflag	; clear print flag
	sta	nflag	; clear new line flag
	lxi	h,tbuff	; place zero at end of command line
	mov	a,m	; get char count
	inx	h	; pt to first char
	push	h	; save ptr
	add	l	; HL=HL+A
	mov	l,a
	mov	a,h
	aci	0
	mov	h,a
	mvi	m,0	; store ending zero
	pop	h	; pt to first char
	call	sblank	; skip to first non-blank
	ora	a	; EOL means print Help Message
	jz	phelp
	cpi	'/'	; slash means print Help Message also
	jnz	echo	; if not slash, print buffer contents
	inx	h	; pt to next character
	mov	a,m	; get next char
	cpi	'P'	; printer?
	jnz	phelp
	mvi	a,0ffh	; set print flag
	sta	pflag
	inx	h	; pt to after the P
	mov	a,m	; get option letter
	cpi	'N'	; new line?
	jnz	echo
	inx	h	; pt to after option letter
	mvi	a,0ffh	; set new line flag
	sta	nflag
	jmp	echo	; perform function

;
;  Print Help Message
;
phelp:
	call	print
	db	'ECHO  Version '
	db	(vers/10)+'0','.',(vers mod 10)+'0'
	db	cr,lf,'	ECHO prints the command line on the user''s console'
	db	cr,lf,'or printer.  It is invoked by the following forms:'
	db	cr,lf
	db	cr,lf,'		ECHO or ECHO //		<-- Print this Help'
	db	cr,lf,'		ECHO text		<-- Print text'
	db	cr,lf,'		ECHO /po text		<-- Print text on LST:'
	db	cr,lf
	db	cr,lf,'	In the last form, the significant text begins'
	db	cr,lf,'immediately after the option letter.  If this option'
	db	cr,lf,'letter is N, then the text is NOT followed by a new'
	db	cr,lf,'line.  With no option letter, the text is followed by'
	db	cr,lf,'a carriage return/line feed pair.  This way, ECHO /P'
	db	cr,lf,'simply outputs a new line to the printer.'
	db	cr,lf,'	ECHO performs NO control character interpretation'
	db	cr,lf,'(such as tab expansion).'
	db	cr,lf,0
	ret
;
;  Echo Command Line
;
echo:
	lda	pflag	; printing?
	ora	a	; 0=no
	cz	crlf	; new line
	call	pstr	; simply print string starting at HL
	lda	pflag	; printing?
	ora	a	; 0=no
	rz
	lda	nflag	; new line?
	ora	a	; 0=yes (reverse logic)
	cz	lcrlf	; new line
	ret
;
;  Print string (with no interpretation) pointed to by HL
;
pstr:
	mov	a,m	; get next char
	ora	a	; done?
	rz
	inx	h	; pt to next
	mov	b,a	; save char
	lda	pflag	; con or lst?
	ora	a	; 0=con
	jz	pstrc
	mov	a,b	; get char
	call	lout	; list
	jmp	pstr
pstrc:
	mov	a,b	; get char
	call	cout	; console
	jmp	pstr
;
;  Skip to Non-Blank
;
sblank:
	mov	a,m	; get char
	inx	h	; pt to next
	cpi	' '	; skip if space
	jz	sblank
	dcx	h	; back up to non-space
	ret

;
;  Buffers
;
pflag:	ds	1	; print flag
nflag:	ds	1	; new line flag


	end
